题意:把一个有$n$个点的树划分成若干个省,要求每个省至少要有$B$个城市,最多可以有$3B$个城市。
我们可以考虑这样一种构造方法:
我们$dfs$整棵树,处理当前节点$u$时,将其子节点进行分块,如果需要进行分块的节点数不能整除块的大小,则将未被分块的子节点与$u$分在同一个块。
枚举$u$的每个子节点$v$,递归处理子树后,将每个子节点返回的未被分块的节点添加到集合$S$中,一旦$\vert S\vert\geqslant size$就把$S$作为一个新的块并将$u$作为省会,然后清空$S$并继续枚举$v$。
处理完所有子树后,将$u$也加入到集合$S$中,此时在$S$中的节点为未被分块的节点,将被返回到上一层,显然$S$的大小最大为$size$,$size-1$个子树节点$+u$节点本身。
由于返回的集合的大小最大为$size$,对于一个子树会对集合最多增加$B-1$个节点,那么每个块的大小最大为$2B-1,$满足条件。
在$dfs$结束后,集合$S$中可能还有节点(最多有$B$个),那么我们把这$ B$个节点并入最后一个块(以根节点为省会的最后一个块,块的大小最大为 $2B-1$)中,那么这个块的大小最大为$3B-1$,符合条件。
1 |
|